/*
 * Title:        CloudSim Toolkit
 * Description:  CloudSim (Cloud Simulation) Toolkit for Modeling and Simulation of Clouds
 * Licence:      GPL - http://www.gnu.org/copyleft/gpl.html
 *
 * Copyright (c) 2009-2010, The University of Melbourne, Australia
 */

package org.cloudbus.cloudsim;

/**
 * This class contains additional tags for the DataCloud functionalities,
 * such as file information retrieval, file transfers, and
 * storage info.
 *
 * @author		Uros Cibej
 * @author		Anthony Sulistio
 * @since		CloudSim Toolkit 1.0
 */
public final class DataCloudTags {
    // to prevent a conflict with the existing CloudSimTags values
    private static final int BASE = 400;        // for other general tags
    private static final int RM_BASE = 500;     // for Replica Manager tags
    private static final int CTLG_BASE = 600;   // for catalogue tags

    //////////// GENERAL TAGS

    /** Default Maximum Transmission Unit (MTU) of a link in bytes */
    public static final int DEFAULT_MTU = 1500;

    /** The default packet size (in byte) for sending events to other entity. */
    public static final int PKT_SIZE = DEFAULT_MTU * 100;  // in bytes

    /** The default storage size (10 GByte) */
    public static final int DEFAULT_STORAGE_SIZE = 10000000; // 10 GB in bytes

    /** Registers a Replica Catalogue (RC) entity to a Data GIS */
    public static final int REGISTER_REPLICA_CTLG = BASE + 1;

    /** Denotes a list of all Replica Catalogue (RC) entities that are listed
     * in this regional Data GIS entity.
     * This tag should be called from a user to Data GIS.
     */
    public static final int INQUIRY_LOCAL_RC_LIST = BASE + 2;

    /** Denotes a list of Replica Catalogue (RC) entities that are listed
     * in other regional Data GIS entities.
     * This tag should be called from a user to Data GIS.
     */
    public static final int INQUIRY_GLOBAL_RC_LIST = BASE + 3;

    /** Denotes a list of Replica Catalogue IDs.
     * This tag should be called from a Regional Data GIS to another
     */
    public static final int INQUIRY_RC_LIST = BASE + 4;

    /** Denotes a result regarding to a list of Replica Catalogue IDs.
     * This tag should be called from a Regional Data GIS to a sender
     * Regional Data GIS.
     */
    public static final int INQUIRY_RC_RESULT = BASE + 5;

    /**
     * Denotes the submission of a DataCloudlet. This tag is normally
     * used between user and DataCloudResource entity.
     */
    public static final int DATAcloudlet_SUBMIT = BASE + 6;



    //////////// REPLICA MANAGER TAGS

    //***********************User <--> RM******************************//

    /** Requests for a file that is stored on the local storage(s).<br>
     * The format of this request is
     * Object[2] = {String lfn, Integer senderID}.<br>
     * The reply tag name is {@link #FILE_DELIVERY}.
     */
    public static final int FILE_REQUEST = RM_BASE + 1;

    /** Sends the file to the requester.
     * The format of the reply is File or null if error happens
     */
    public static final int FILE_DELIVERY = RM_BASE + 2;


    ///////////////////////////////////////////////////////////////////////

    /** Requests for a master file to be added to the local storage(s).<br>
     * The format of this request is
     * Object[2] = {File obj, Integer senderID}.<br>
     * The reply tag name is {@link #FILE_ADD_MASTER_RESULT}.
     */
    public static final int FILE_ADD_MASTER = RM_BASE + 10;

    /** Sends the result of adding a master file back to sender.<br>
     * The format of the reply is
     * Object[3] = {String lfn, Integer uniqueID, Integer resultID}.<br>
     * NOTE: The result id is in the form of FILE_ADD_XXXX where XXXX means
     * the error/success message
     */
    public static final int FILE_ADD_MASTER_RESULT = RM_BASE + 11;

    /** Requests for a replica file to be added from the local storage(s).<br>
     * The format of this request is
     * Object[2] = {File obj, Integer senderID}.<br>
     * The reply tag name is {@link #FILE_ADD_REPLICA_RESULT}.
     */
    public static final int FILE_ADD_REPLICA = RM_BASE + 12;

    /** Sends the result of adding a replica file back to sender.<br>
     * The format of the reply is
     * Object[2] = {String lfn, Integer resultID}.<br>
     * NOTE: The result id is in the form of FILE_ADD_XXXX where XXXX means
     * the error/success message
     */
    public static final int FILE_ADD_REPLICA_RESULT = RM_BASE + 13;

    /** Denotes that file addition is successful */
    public static final int FILE_ADD_SUCCESSFUL = RM_BASE + 20;

    /** Denotes that file addition is failed because the storage is full */
    public static final int FILE_ADD_ERROR_STORAGE_FULL = RM_BASE + 21;

    /** Denotes that file addition is failed because the given file is empty */
    public static final int FILE_ADD_ERROR_EMPTY = RM_BASE + 22;

    /** Denotes that file addition is failed because the file already exists
     * in the catalogue and it is read-only file
     */
    public static final int FILE_ADD_ERROR_EXIST_READ_ONLY = RM_BASE + 23;

    /** Denotes that file addition is failed due to an unknown error */
    public static final int FILE_ADD_ERROR = RM_BASE + 24;

    /** Denotes that file addition is failed because access/permission denied
     * or not authorized
     */
    public static final int FILE_ADD_ERROR_ACCESS_DENIED = RM_BASE + 25;


    ///////////////////////////////////////////////////////////////////////

    /** Requests for a master file to be deleted from the local storage(s).<br>
     * The format of this request is
     * Object[2] = {String lfn, Integer senderID}.<br>
     * The reply tag name is {@link #FILE_DELETE_MASTER_RESULT}.
     */
    public static final int FILE_DELETE_MASTER = RM_BASE + 30;

    /** Sends the result of deleting a master file back to sender.<br>
     * The format of the reply is
     * Object[2] = {String lfn, Integer resultID}.<br>
     * NOTE: The result id is in the form of FILE_DELETE_XXXX where XXXX means
     * the error/success message
     */
    public static final int FILE_DELETE_MASTER_RESULT = RM_BASE + 31;

    /** Requests for a replica file to be deleted from the local storage(s).<br>
     * The format of this request is
     * Object[2] = {String lfn, Integer senderID}.<br>
     * The reply tag name is {@link #FILE_DELETE_REPLICA_RESULT}.
     */
    public static final int FILE_DELETE_REPLICA = RM_BASE + 32;

    /** Sends the result of deleting a replica file back to sender.<br>
     * The format of the reply is
     * Object[2] = {String lfn, Integer resultID}.<br>
     * NOTE: The result id is in the form of FILE_DELETE_XXXX where XXXX means
     * the error/success message
     */
    public static final int FILE_DELETE_REPLICA_RESULT = RM_BASE + 33;

    /** Denotes that file deletion is successful */
    public static final int FILE_DELETE_SUCCESSFUL = RM_BASE + 40;

    /** Denotes that file deletion is failed due to an unknown error */
    public static final int FILE_DELETE_ERROR = RM_BASE + 41;

    /** Denotes that file deletion is failed because it is a read-only file */
    public static final int FILE_DELETE_ERROR_READ_ONLY = RM_BASE + 42;

    /** Denotes that file deletion is failed because the file does not
     * exist in the storage nor catalogue
     */
    public static final int FILE_DELETE_ERROR_DOESNT_EXIST = RM_BASE + 43;

    /** Denotes that file deletion is failed because it is currently used
     * by others
     */
    public static final int FILE_DELETE_ERROR_IN_USE = RM_BASE + 44;

    /** Denotes that file deletion is failed because access/permission denied
     * or not authorized
     */
    public static final int FILE_DELETE_ERROR_ACCESS_DENIED = RM_BASE + 45;


    ///////////////////////////////////////////////////////////////////////

    /** Requests for a file to be modified from the local storage(s).<br>
     * The format of this request is
     * Object[2] = {File obj, Integer senderID}.<br>
     * The reply tag name is {@link #FILE_MODIFY_RESULT}.
     */
    public static final int FILE_MODIFY = RM_BASE + 50;

    /** Sends the result of deleting a file back to sender.<br>
     * The format of the reply is
     * Object[2] = {String lfn, Integer resultID}.<br>
     * NOTE: The result id is in the form of FILE_MODIFY_XXXX where XXXX means
     * the error/success message
     */
    public static final int FILE_MODIFY_RESULT = RM_BASE + 51;

    /** Denotes that file modification is successful */
    public static final int FILE_MODIFY_SUCCESSFUL = RM_BASE + 60;

    /** Denotes that file modification is failed due to an unknown error */
    public static final int FILE_MODIFY_ERROR = RM_BASE + 61;

    /** Denotes that file modification is failed because it is
     * a read-only file
     */
    public static final int FILE_MODIFY_ERROR_READ_ONLY = RM_BASE + 62;

    /** Denotes that file modification is failed because the file
     * does not exist
     */
    public static final int FILE_MODIFY_ERROR_DOESNT_EXIST = RM_BASE + 63;

    /** Denotes that file modification is failed because the file is currently
     * used by others
     */
    public static final int FILE_MODIFY_ERROR_IN_USE = RM_BASE + 64;

    /** Denotes that file modification is failed because access/permission
     * denied or not authorized
     */
    public static final int FILE_MODIFY_ERROR_ACCESS_DENIED = RM_BASE + 65;


    //////////// REPLICA CATALOGUE TAGS

    //***********************User<-->RC******************************//

    /** Denotes the request for a location of a replica file.<br>
     * The format of this request is
     * Object[2] = {String lfn, Integer senderID}.<br>
     * The reply tag name is {@link #CTLG_REPLICA_DELIVERY}.<br>
     * NOTE: This request only ask for one location only not all.
     */
    public static final int CTLG_GET_REPLICA = CTLG_BASE + 1;

    /** Sends the result for a location of a replica file back to sender.<br>
     * The format of the reply is
     * Object[2] = {String lfn, Integer resourceID}.<br>
     * NOTE: The resourceID could be <tt>-1</tt> if not found.
     */
    public static final int CTLG_REPLICA_DELIVERY = CTLG_BASE + 2;

    /** Denotes the request for all locations of a replica file.<br>
     * The format of this request is
     * Object[2] = {String lfn, Integer senderID}.<br>
     * The reply tag name is {@link #CTLG_REPLICA_LIST_DELIVERY}.
     */
    public static final int CTLG_GET_REPLICA_LIST = CTLG_BASE + 3;

    /** Sends the result for all locations of a replica file back to sender.<br>
     * The format of the reply is
     * Object[2] = {String lfn, List locationList}.<br>
     * NOTE: The locationList could be <tt>null</tt> if not found.
     */
    public static final int CTLG_REPLICA_LIST_DELIVERY = CTLG_BASE + 4;

    /** Denotes the request to get the attribute of a file.<br>
     * The format of this request is
     * Object[2] = {String lfn, Integer senderID}.<br>
     * The reply tag name is {@link #CTLG_FILE_ATTR_DELIVERY}.
     */
    public static final int CTLG_GET_FILE_ATTR = CTLG_BASE + 5;

    /** Sends the result for a file attribute back to sender.<br>
     * The format of the reply is {FileAttribute fileAttr}.<br>
     * NOTE: The fileAttr could be <tt>null</tt> if not found.
     */
    public static final int CTLG_FILE_ATTR_DELIVERY = CTLG_BASE + 6;

    /** Denotes the request to get a list of file attributes based on
     * the given filter.<br>
     * The format of this request is
     * Object[2] = {Filter filter, Integer senderID}.<br>
     * The reply tag name is {@link #CTLG_FILTER_DELIVERY}.
     */
    public static final int CTLG_FILTER = CTLG_BASE + 7;

    /** Sends the result for a list of file attributes back to sender.<br>
     * The format of the reply is {List attrList}.<br>
     * NOTE: The attrList could be <tt>null</tt> if not found.
     */
    public static final int CTLG_FILTER_DELIVERY = CTLG_BASE + 8;


    //***********************RM<-->RC******************************//

    /** Denotes the request to register / add a master file to the Replica
     * Catalogue.<br>
     * The format of this request is
     * Object[3] = {String filename, FileAttribute attr, Integer resID}.<br>
     * The reply tag name is {@link #CTLG_ADD_MASTER_RESULT}.
     */
    public static final int CTLG_ADD_MASTER = CTLG_BASE + 10;

    /** Sends the result of registering a master file back to sender.<br>
     * The format of the reply is
     * Object[3] = {String filename, Integer uniqueID, Integer resultID}.<br>
     * NOTE: The result id is in the form of CTLG_ADD_MASTER_XXXX where
     *       XXXX means the error/success message
     */
    public static final int CTLG_ADD_MASTER_RESULT = CTLG_BASE + 11;

    /** Denotes that master file addition is successful */
    public static final int CTLG_ADD_MASTER_SUCCESSFUL = CTLG_BASE + 12;

    /** Denotes that master file addition is failed due to an unknown error */
    public static final int CTLG_ADD_MASTER_ERROR = CTLG_BASE + 13;

    /** Denotes that master file addition is failed due to the catalogue
     * is full
     */
    public static final int CTLG_ADD_MASTER_ERROR_FULL = CTLG_BASE + 14;


    ///////////////////////////////////////////////////////////////////////

    /** Denotes the request to de-register / delete a master file from the
     * Replica Catalogue.<br>
     * The format of this request is
     * Object[2] = {String lfn, Integer resourceID}.<br>
     * The reply tag name is {@link #CTLG_DELETE_MASTER_RESULT}.
     */
    public static final int CTLG_DELETE_MASTER = CTLG_BASE + 20;

    /** Sends the result of de-registering a master file back to sender.<br>
     * The format of the reply is
     * Object[2] = {String lfn, Integer resultID}.<br>
     * NOTE: The result id is in the form of CTLG_DELETE_MASTER_XXXX where
     *       XXXX means the error/success message
     */
    public static final int CTLG_DELETE_MASTER_RESULT = CTLG_BASE + 21;

    /** Denotes that master file deletion is successful */
    public static final int CTLG_DELETE_MASTER_SUCCESSFUL = CTLG_BASE + 22;

    /** Denotes that master file deletion is failed due to an unknown error */
    public static final int CTLG_DELETE_MASTER_ERROR = CTLG_BASE + 23;

    /** Denotes that master file deletion is failed because the file
     * does not exist in the catalogue
     */
    public static final int CTLG_DELETE_MASTER_DOESNT_EXIST = CTLG_BASE + 24;

    /** Denotes that master file deletion is failed because replica files
     * are still in the catalogue. All replicas need to be deleted first.
     */
    public static final int CTLG_DELETE_MASTER_REPLICAS_EXIST = CTLG_BASE + 25;


    ///////////////////////////////////////////////////////////////////////

    /** Denotes the request to register / add a replica file to the Replica
     * Catalogue.<br>
     * The format of this request is
     * Object[2] = {String lfn, Integer resourceID}.<br>
     * The reply tag name is {@link #CTLG_ADD_REPLICA_RESULT}.
     */
    public static final int CTLG_ADD_REPLICA = CTLG_BASE + 30;

    /** Sends the result of registering a replica file back to sender.<br>
     * The format of the reply is
     * Object[2] = {String lfn, Integer resultID}.<br>
     * NOTE: The result id is in the form of CTLG_ADD_REPLICA_XXXX where
     *       XXXX means the error/success message
     */
    public static final int CTLG_ADD_REPLICA_RESULT = CTLG_BASE + 31;

    /** Denotes that replica file addition is successful */
    public static final int CTLG_ADD_REPLICA_SUCCESSFUL = CTLG_BASE + 32;

    /** Denotes that replica file addition is failed due to an unknown error */
    public static final int CTLG_ADD_REPLICA_ERROR = CTLG_BASE + 33;

    /** Denotes that replica file addition is failed because the given
     * file name does not exist in the catalogue
     */
    public static final int CTLG_ADD_REPLICA_ERROR_DOESNT_EXIST = CTLG_BASE +34;

    /** Denotes that replica file addition is failed due to the catalogue
     * is full
     */
    public static final int CTLG_ADD_REPLICA_ERROR_FULL = CTLG_BASE + 35;


    ///////////////////////////////////////////////////////////////////////

    /** Denotes the request to de-register / delete a replica file from the
     * Replica Catalogue.<br>
     * The format of this request is
     * Object[2] = {String lfn, Integer resourceID}.<br>
     * The reply tag name is {@link #CTLG_DELETE_REPLICA_RESULT}.
     */
    public static final int CTLG_DELETE_REPLICA = CTLG_BASE + 40;

    /** Sends the result of de-registering a replica file back to sender.<br>
     * The format of the reply is
     * Object[2] = {String lfn, Integer resultID}.<br>
     * NOTE: The result id is in the form of CTLG_DELETE_REPLICA_XXXX where
     *       XXXX means the error/success message
     */
    public static final int CTLG_DELETE_REPLICA_RESULT = CTLG_BASE + 41;

    /** Denotes that replica file deletion is successful */
    public static final int CTLG_DELETE_REPLICA_SUCCESSFUL = CTLG_BASE + 42;

    /** Denotes that replica file deletion is failed due to an unknown error */
    public static final int CTLG_DELETE_REPLICA_ERROR = CTLG_BASE + 43;

    /** Denotes that replica file deletion is failed because the file
     * does not exist in the catalogue
     */
    public static final int CTLG_DELETE_REPLICA_ERROR_DOESNT_EXIST=CTLG_BASE+44;


    ///////////////////////////////////////////////////////////////////////

    /** Denotes the request to modify an existing master file information
     * stored in the Replica Catalogue.<br>
     * The format of this request is
     * Object[3] = {String filename, FileAttribute attr, Integer resID}.<br>
     * The reply tag name is {@link #CTLG_MODIFY_MASTER_RESULT}.
     */
    public static final int CTLG_MODIFY_MASTER = CTLG_BASE + 50;

    /** Sends the result of modifying a master file back to sender.<br>
     * The format of the reply is
     * Object[2] = {String lfn, Integer resultID}.<br>
     * NOTE: The result id is in the form of CTLG_MODIFY_MASTER_XXXX where
     *       XXXX means the error/success message
     */
    public static final int CTLG_MODIFY_MASTER_RESULT = CTLG_BASE + 51;

    /** Denotes that master file deletion is successful */
    public static final int CTLG_MODIFY_MASTER_SUCCESSFUL = CTLG_BASE + 52;

    /** Denotes that master file modification is failed due to an
     * unknown error
     */
    public static final int CTLG_MODIFY_MASTER_ERROR = CTLG_BASE + 53;

    /** Denotes that master file modification is failed because the file
     * does not exist in the catalogue
     */
    public static final int CTLG_MODIFY_MASTER_ERROR_DOESNT_EXIST= CTLG_BASE+54;

    /** Denotes that master file modification is failed because the file
     * attribute is set to a read-only
     */
    public static final int CTLG_MODIFY_MASTER_ERROR_READ_ONLY = CTLG_BASE+55;


    ///////////////////////////////////////////////////////////////////////

    /** Private Constructor */
    private DataCloudTags() {
        throw new UnsupportedOperationException("DataCloudTags cannot be instantiated");
    }

}

